#include <head.h>

void *withdraw(void *arg);

sem_t sem;            // 信号量，用于限制同时进行取款操作的客户数量
int balance = 1000;   // 银行账户余额
pthread_mutex_t lock; // 互斥锁，用于保护共享资源（银行账户余额）

int main()
{
    pthread_t threads[5];
    int thread_count = sizeof(threads) / sizeof(threads[0]);

    // 初始化互斥锁和信号量
    pthread_mutex_init(&lock, NULL);
    sem_init(&sem, 0, 2); // 允许最多两个客户同时取款

    // 创建线程
    for (int i = 0; i < thread_count; i++)
    {
        printf("用户%d 等待取款.....\n", i);
        pthread_create(&threads[i], NULL, withdraw, NULL);
    }

    // 等待所有线程完成
    for (int i = 0; i < thread_count; i++)
    {
        pthread_join(threads[i], NULL);
    }

    // 销毁互斥锁和信号量
    pthread_mutex_destroy(&lock);
    sem_destroy(&sem);

    return 0;
}

void *withdraw(void *arg)
{
    // 获取信号量许可
    sem_wait(&sem);

    // 锁定互斥锁以访问共享资源
    pthread_mutex_lock(&lock);

    // 检查余额是否足够
    if (balance >= 100)
    {
        balance -= 100;
        printf("取款成功，余额：%d\n", balance);
    }
    else
    {
        printf("余额不足，取款失败\n");
    }

    // 解锁互斥锁
    pthread_mutex_unlock(&lock);

    // 释放信号量许可
    sem_post(&sem);

    return NULL;
}
